package com.wzt.gift.service.impl;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.wzt.gift.asserts.Assert;
import com.wzt.gift.clients.LoginUserClient;
import com.wzt.gift.domain.Employee;
import com.wzt.gift.domain.LoginUser;
import com.wzt.gift.domain.Tenant;
import com.wzt.gift.dto.SettleDto;
import com.wzt.gift.enums.ResponseEnum;
import com.wzt.gift.mapper.EmployeeMapper;
import com.wzt.gift.mapper.TenantMapper;
import com.wzt.gift.query.TenantQuery;
import com.wzt.gift.service.ITenantService;
import com.wzt.gift.util.AjaxResult;
import com.wzt.gift.util.PageList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author wzt
 * @since 2022-10-09
 */
@Service
public class TenantServiceImpl extends ServiceImpl<TenantMapper, Tenant> implements ITenantService {
    @Autowired
    private TenantMapper tenantMapper;
    @Autowired
    private EmployeeMapper employeeMapper;

    @Autowired
    private LoginUserClient loginUserClient;

    @Override
    public PageList<Tenant> selectPageList(TenantQuery query) {
        // 分页条件
        Page<Tenant> page = new Page<>(query.getPage(), query.getRows());
        List<Tenant> tenants = tenantMapper.selectPageList(page, query);
        return new PageList<Tenant>(page.getTotal(), tenants);
    }

    @Override
    public AjaxResult settle(SettleDto settleDto) {
        Employee admin = settleDto.getAdmin();
        admin.setType(5);
        Tenant tenant = settleDto.getTenant();
        // 1 参数验证
        if (validate(settleDto)) {

            // 2 参数验证通过保存信息到数据库中
            // 2.1 保存登录信息
            LoginUser loginUser = new LoginUser();
            loginUser.setUsername(admin.getUsername());
            loginUser.setPassword(admin.getPassword());
            loginUser.setEmail(admin.getEmail());
            loginUser.setTel(admin.getTel());
            loginUser.setType(admin.getType());
            loginUserClient.addOrUpdate(loginUser);
            // 方案1：谁提供服务谁写 好处：能直接用它的公共代码,坏处就是要让别人写接口---一个团队甚至一个人
            // 方案2：更加接口文档自己来写  好处：没有任何耦合，坏处：有重复dto----如果两个团队分别写服务


            // 2.2 保存租户管理员
            employeeMapper.insert(admin);
            // 2.3 保存租户信息
            tenantMapper.insert(tenant);
            // 2.4 保存租户套餐信息
            HashMap<String, Long> map = new HashMap<>();
            map.put("tenant_id", tenant.getId());
            map.put("mean_id", settleDto.getMealId());
            tenantMapper.insertTenantMeal(map);
        }

        return AjaxResult.me().setSuccess(true).setMessage("入驻成功！");
    }

    private boolean validate(SettleDto settleDto) {
        Employee admin = settleDto.getAdmin();
        Tenant tenant = settleDto.getTenant();

        // 1 参数校验
        // 1.1 密码比对
        Assert.strIsEqual(admin.getPassword(), admin.getConfirmPassword(), "两次输入密码不一致！");

        // 1.2 店铺是否存在校验
        EntityWrapper<Tenant> tenantWrapper = new EntityWrapper<>();
        tenantWrapper.eq("company_name", tenant.getCompanyName());
        List<Tenant> tenants = tenantMapper.selectList(tenantWrapper);
        Assert.listIsEmpty(tenants, ResponseEnum.CODE_TENANT_EXISTED);

        // 1.3 店铺管理员存在校验
        EntityWrapper<Employee> employeeWrapper = new EntityWrapper<>();
        employeeWrapper.eq("username", admin.getUsername());
        List<Employee> employees = employeeMapper.selectList(employeeWrapper);
        Assert.listIsEmpty(employees, ResponseEnum.CODE_USER_EXISTED);

        return true;
    }
}
